home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / ps85a14.arc / LEVELI.DOC < prev    next >
Text File  |  1988-05-15  |  24KB  |  691 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.                              PseudoSam Assembler Manual Level I
  12.                              Copyright(c) 1986,87,88 PseudoCode
  13.                              All right reserved!
  14.  
  15.  
  16.  
  17.  
  18.  
  19. Disclaimer:
  20.  
  21.             PseudoSam software is distributed as is, with no guarantee that
  22.             it will work correctly in all situations.  In no event will the
  23.             Author be liable for any damages, including lost profits,
  24.             lost savings or other incidental or consequential damages
  25.             arising out of the use of or inability to use these
  26.             programs, even if the Author has been advised of the
  27.             possibility of such damages, or for any claim by any other
  28.             party.
  29.  
  30.             It is the users reponsibility to back up all important files!
  31.  
  32.             See copyright information in appendix B
  33.  
  34.  
  35.  
  36.  
  37.  
  38.                          Table of Contents
  39.  
  40. Chapter 1  PseudoSam Assemblers vs. other assemblers.
  41.  
  42. Chapter 2  Running the assembler program.
  43.  
  44. Chapter 3  Assembler statement syntax.
  45.  
  46. Chapter 4  Data types.
  47.  
  48. Chapter 5  Expressions.
  49.  
  50. Chapter 6  Assembler Directives.
  51.   (also known as assembler pseudo-opcodes, or pseudo-ops)
  52.  
  53. Appendix A      ASCII character set.
  54.  
  55. Appendix B      Copyright information.
  56.  
  57.  
  58. Chapter 1 PseudoSam assemblers vs. other assemblers
  59.  
  60.      All PseudoSam(Pseudo brand Symbolic AsseMbler) assemblers conform to
  61.      a common syntax based on the UNIX system V assembler syntax. By
  62.      conforming to this Pseudo standard, conflicts with the manufacturers
  63.      syntax are created.
  64.  
  65. * The difference between another assembler's name and the PseudoSam name
  66.   of an assembler directive can be circumvented by the .opdef
  67.   directive.
  68.  
  69.   example
  70.  
  71.    .opdef  eject,.eject      ;defines eject to be synonymous with .eject
  72.    .opdef  fcc,.db           ;fcc will now form constant characters as it
  73.                              ;should.
  74.  
  75. *  A file syn.asm is distributed with the assembler with some useful
  76.    redefinitions.
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87. Unix system V is a trademark of AT & T.
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95. Chapter 2  Running the assembler program
  96.  
  97. 1.  Command line switch setting and source file specification.
  98.  
  99.      Assuming the user has an assembly language source file called foo.asm
  100.      type the following command:
  101.  
  102. aXX foo
  103.  
  104.  where the PseudoSam assembler number is substituted for XX.
  105.  
  106.      The assembler will assemble the program foo.asm using the default
  107.      assembler switch settings. the following files will be generated
  108.      by the assembler:
  109.  
  110.      foo.lst   ;assembled listing shown the code conversion and
  111.                ; any errors that where discover by the assembler.
  112.  
  113.      foo.obj   ;assembled object code in Hex format.
  114.  
  115. **  for a list of switch setting see the .command assembler directive
  116.     description in chapter 6.
  117.  
  118. *** The assembler uses the following temporary file names.
  119.  
  120.     z0z0z0z0.tmp
  121.     z1z1z1z1.tmp
  122.  
  123.     ANY files with these names will be DESTROYED by the
  124.     by the assembler.
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132. Chapter 3  Assembler statement syntax
  133.  
  134. 1. Assembler Statements
  135.  
  136.      Assembler statements contain from zero to 4 fields as shown in
  137.      following.
  138.  
  139. <label> <opcode> <expressions> <comment>
  140.  
  141.      All fields are optional, but they must be in this order.
  142.  
  143. A.   Labels (<label>) are symbolic names that are assigned the starting
  144.      address of any code generated by the opcode and or expressions
  145.      of the line containing the label declaration.(see section 2).
  146.  
  147. B.   Operation codes(<opcode>) tell the assembler what machine instruction
  148.      to generate, or what assembler control function to perform.
  149.      The operation code also tells the assembler what expressions are
  150.      required to complete the machine instruction or assembler directive.
  151.      (see chapter 6).
  152.  
  153. C.   Expression requirements are set by the opcode(see the microprocessor
  154.      manufacturers reference manual or the assembler directives chapter
  155.      for individual opcode requirements).(see chapter 5).
  156.  
  157. D.   Comments are notes written by the programmer to explain what the
  158.      program is trying to accomplish. Comments generate no code.
  159.      (see section 3).
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167. 2.  Labels
  168.  
  169.      Labels can be unlimited in length, but only the first eight characters
  170.      are used to distinguish between them.  They must conform to the
  171.      following syntax.
  172.  
  173.      <label>  -> <identifier>':'
  174.  
  175.      <identifier> -> <alphabetic character> <identifier character string>
  176.  
  177.      <alphabetic character> -> character in the set ['A'..'Z', 'a'..'z', '.']
  178.  
  179.      <identifier character string> -> any sequence of characters from the
  180.                                       set ['A'..'Z','a'..'z', '.', '0'..'9']
  181.  
  182. example
  183. abc:                  ;label referred to as abc
  184. a c:                  ;not a valid label
  185.          foo:         ;label referred to as foo
  186. .123:                 ;label referred to as .123
  187.  
  188. * Case makes NO difference!
  189.  
  190. d:      ;is the same as
  191. D:
  192.  
  193.  
  194. 3.  Comments
  195.      Comments must start with a semi-colon ; and are terminated
  196.      by an end of line or file( <lf>(^J) or <sub>(^Z) ). An end
  197.      of line is inserted by typing the enter or return key by
  198.      most text editors.
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206. Chapter 4     Data types
  207.  
  208. 1.  Integers
  209.  
  210.     Integer constants can be specified in any of the following forms:
  211.  
  212. A.  Binary
  213.  
  214.     b'bb             ;bb=string of binary digits
  215.     B'bb
  216.  
  217. B.  Decimal
  218.  
  219.     ndd
  220.     d'dd             ;n=nozero decimal digit
  221.     D'dd             ;dd=string of decimal digits
  222.  
  223. C.  Octal
  224.  
  225.     0qq              ;qq=string of octal digits
  226.     o'qq
  227.     O'qq
  228.     q'qq
  229.     Q'qq
  230.  
  231. D.  Hexidecimal
  232.  
  233.     0x'hh            ;hh=string of hexidecimal digits
  234.     0X'hh
  235.     h'hh
  236.     H'hh
  237.     x'hh
  238.     X'hh
  239.  
  240.  
  241. Examples:
  242.  
  243.     077        ;octal number 77 = decimal 63
  244.     b'0101     ;binary number 101 = decimal 5
  245.     77         ;decimal number 77 = octal 115
  246.     h'ff       ;hexidecimal ff = decimal 255
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253. 2.  Strings:
  254.  
  255.     Strings consist of a beginning quote " followed by any reasonable number
  256.     of characters followed by an ending quote ". Control characters and double
  257.     quotes " and backslash \ may not be used in strings directly.  These
  258.     special characters are included by using a special escape sequence which
  259.     the assembler translates into the appropriate ASCII code.
  260.  
  261. Note: Strings may not be used in expressions!
  262.       Although character constants may(see below).
  263.  
  264. Escape sequences
  265.   "\"" string containing "
  266.   "\\" string containing \
  267.   "\'" string containing '
  268.   "\0" string containing null
  269.   "\n" string containing linefeed
  270.   "\r" string containing carriage return
  271.   "\f" string containing formfeed
  272.   "\t" string containing horizontal tab
  273.   "\nnn" string containing the ASCII character who's code is o'nnn
  274.          (nnn are octal digits).
  275.   * see appendix A for ASCII codes.
  276.  
  277. 3.  Character Constants:
  278.  
  279.     Character constants consist of  a single quote ' followed by
  280.     a character or an escape sequence(see above) followed by a
  281.     single quote '.
  282.  
  283. example:
  284.    'A' = ASCII character value for the letter A = 65 (decimal);
  285.    '\''= ASCII character value for the character ' = 39 (decimal).
  286.  
  287. Character constants are treated as integers by the assembler and
  288. are valid where ever an integer value is valid.
  289.  
  290. example:
  291.    'A' + 1 = 66
  292.  
  293.   * see appendix A for ASCII codes.
  294.  
  295. 4.  Symbolic values
  296.  
  297.     Symbolic values are generally labels, but may be any identifier
  298.     assigned an integer value(using .set or .equ pseudo-ops).
  299.  
  300.     As a special case the symbol * when used as an operand in an
  301.     expression denotes the value of the location counter (the value
  302.     the program counter will have during operation) at the beginning
  303.     of the current line.
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310. Chapter 5  Expressions
  311.  
  312.      All expressions evaluate to integer values modulo 65536(2^16) and are
  313.      written in infix notation(the way you normally write them).  Operators
  314.      provided are grouped below in order of precedence.
  315.  
  316. 1. (unary)
  317. ~           logical bit wise complement(not) of its operand(one's complement).
  318. -           arithemetic complement, or negation(two's complement).
  319.  
  320. 2. (binary)
  321. *           integer multiply (two's complement).
  322. /           integer divide   (two's complement).
  323. %           modulus          (result is always positive)
  324. >>          logical shift right (left operand shifted right operand times).
  325. <<          logical shift left (left operand shifted right operand times).
  326. ~           equivalent to  A or ( ~B ).
  327.  
  328. 3. (binary)
  329. |           logical bitwise or(inclusive-or) of two operands.
  330. ^           logical bitwise exclusive-or of two operands.
  331. &           logical bitwise and of two operands.
  332.  
  333. 4. (binary)
  334. +           addition (two's complement).
  335. -           subtraction (two's complement).
  336.  
  337.      Since this version does not generate relocatable code there exists only
  338.      one "type" of operand that can be in an expression.  So anything goes
  339.      except divide by 0(1 will be substituted ).
  340.  
  341. examples:
  342.     -1 = h'ffff  (two's complement notation).
  343.     -1 >> 8 = h'00ff
  344.     -1 << 8 = h'ff00
  345.     3 / 2 = 1
  346.     6 / 2 = 3
  347.     5 / 0 = 5
  348.     -2 / 1 = -2
  349.     -3 /-2 = 1
  350.     2 * -3 = -6
  351.     b'00 & b'11 = 0
  352.     b'11 & b'10 = 2
  353.     2 * b'01 & b'10 = 2
  354.     b'01 ^ b'11 = 2
  355.     b'01 | b'11 = 3
  356.  
  357. Notice that spaces are ignored in expressions.
  358.  
  359.  
  360.  
  361.  
  362.  
  363.  
  364.  
  365.  
  366. Chapter 6  Assembler Directives
  367.   (also known as assembler Pseudo-opcodes)
  368.  
  369.      The assembler recognizes the following directives:
  370.  
  371.       directive  section    description
  372.  
  373.       .command    1   ;set assembly options(similar to command line options).
  374.  
  375.       .org        2   ;set program origin.
  376.  
  377.       .equ        3   ;equate an identifier to an expression(permanent
  378.                       ; assignment).
  379.  
  380.       .set        4   ;equate and identifier to an expression(temporary
  381.                       ; assignment).
  382.  
  383.       .rs         5   ;reserve storage(memory) space.
  384.  
  385.       .db         6   ;define byte.
  386.  
  387.       .dw         7   ;define word(16 bit).
  388.  
  389.       .drw        8   ;define reversed word(16 bit).
  390.  
  391.       .eject      9   ;form feed in listing
  392.  
  393.       .page      10   ;align location counter on 256 byte memory
  394.                       ; page boundary.
  395.  
  396.       .end       11   ;end of program
  397.  
  398.       .opdef     12   ;equate an identifier with another identifier.
  399.  
  400.       .segment   13   ;define a memory segment.
  401.  
  402.       <segment name>
  403.                  14   ;select segment <segment name> as current segment.
  404.  
  405.       .null      15   ;this is a comment statement.
  406.  
  407.  
  408.  
  409.  
  410.  
  411. 1. .command    <optionlist>   ;allows the programmer to set option switches
  412.                               ;in the same manner as on the command line.
  413.                               ;(the command line is the line typed to run
  414.                               ; this program).
  415.  
  416. <optionlist> -> <option> ' ' <optionlist>
  417. <optionlist> ->
  418.  
  419. <option> -> '-'<available option>
  420. <option> -> '+'<available option>
  421.  
  422. <available option> -> 'a'<decimal number> ;Hex hode format.
  423.                                           ;1 => Intel Hex.
  424.                                           ;2 => Motorola 19 Hex.
  425.  
  426. <available option> -> 'w'<decimal number> ;page width in columns(characters).
  427.                                           ;(-,+ are ignored but one must be
  428.                                           ; there).
  429.  
  430. <available option> -> 'h'<decimal number> ;page height in lines.
  431.                                           ;(-,+ are ignored but one must be
  432.                                           ; there).
  433.  
  434. <available option> -> 'l'                 ;listing on(+) or off(-)
  435.                                           ;if set on command line it overrides
  436.                                           ;all listing controls in program.
  437.  
  438. <available option> -> 'm'<decimal number> ;Machine level.
  439.                                           ;1 => 6800,2,8.
  440.                                           ;2 => 6801,3.
  441.  
  442. <available option> -> 's'                 ;symbol listing on(+) or off(-).
  443.  
  444. <available option> -> 'o'                 ;selects single object module
  445.                                           ;file only(+), or multiple object
  446.                                           ;module files(-)(one for each
  447.                                           ;defined segment in the program).
  448.                                           ;ONLY active on command line!
  449.  
  450. <available option> -> 't'<drive>          ;specifies which drive to create
  451.                                           ;all temporary files on(-,+ are
  452.                                           ; ignored but one must be there).
  453.                                           ;ONLY active on command line!
  454.  
  455. <available option> -> 'p'<drive>          ;specifies which drive to create
  456.                                           ;the listing file on(-,+ are
  457.                                           ; ignored but one must be there).
  458.                                           ;ONLY active on command line!
  459.  
  460. <drive> -> <drive name>':'                ;e.g.  a:  b:  c:  d:
  461.  
  462.                            ;MS-DOS
  463. <drive name> -> 'a'        ;drive a --usually a floppy disk
  464. <drive name> -> 'b'        ;drive b --usually a second floppy disk
  465. <drive name> -> 'c'        ;drive c --usually a hard disk, but may
  466.                                       be a ram disk.
  467. <drive name> -> 'd'        ;drive d --usually a ram disk, but may
  468.                                       be a hard disk.
  469.  
  470. ** The default options are:
  471.   Intel: -a1 -m1 -w132 -h66 +l +s +o
  472.   Motorola: -a2 -m1 -w132 -h66 +l +s +o
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  
  480. 2. .org   <integer expression>    ;sets the assembler location counter
  481.                                   ;to the value of expression.
  482.                                   ;The expression MUST be evaluatable
  483.                                   ;on the first pass. NO FORWARD
  484.                                   ;REFERENCES!
  485.  
  486. 3. .equ  <identifier> ',' <integer expression>
  487.                                   ;gives identifier the value of the
  488.                                   ;integer expression.
  489.                                   ;<identifier> canNOT be redefined!
  490.                                   ;also forward references are allowed
  491.                                   ;as long as they are resolved by the
  492.                                   ;second pass.
  493.  
  494. 4. .set  <identifier> ',' <integer expression>
  495.                                   ;gives identifier the value of the
  496.                                   ;integer expression.
  497.                                   ;<identifier> CAN be redefined later
  498.                                   ; in the program!
  499.                                   ;also forward references are allowed
  500.                                   ;as long as they are resolved by the
  501.                                   ;second pass.
  502.  
  503. 5. .rs  <integer expression>      ;increments the location counter
  504.                                   ;by the value of <integer expresson>
  505.                                   ;effectively reserving that many bytes
  506.                                   ;of memory.
  507.  
  508. 6. .db  <expression-string list>
  509.  
  510. <expression-string list> -> <expression>','<expression-string list>
  511. <expression-string list> -> <string>','<expression-string list>
  512. <expression-string list> -> <expression>
  513. <expression-string list> -> <string>
  514.  
  515.                                   ;creates a byte in the machine code
  516.                                   ;for each <expression> in the list
  517.                                   ;and a byte for each ascii character
  518.                                   ;in the a string.
  519. 7. .dw  <expression list>
  520.  
  521. <expression list> -> <expression>','<expression list>
  522. <expression list> -> <expression>
  523.  
  524.                                   ;creates a word(16 bit) in the machine code
  525.                                   ;for each <expression> in the list.
  526.                                   ;MOST significant byte is stored at LOWER
  527.                                   ;address.
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534. 8. .drw  <expression list>
  535.  
  536. <expression list> -> <expression>','<expression list>
  537. <expression list> -> <expression>
  538.  
  539.                                   ;creates a word(16 bit) in the machine code
  540.                                   ;for each <expression> in the list.
  541.                                   ;LEAST significant byte is stored at LOWER
  542.                                   ;address.
  543.  
  544. 9. .eject                         ;causes a form-feed character to be
  545.                                   ;inserted in listing.(new listing page)
  546.  
  547. 10. .page                         ;increments location counter to next
  548.                                   ;256 byte page boundary.
  549.  
  550. 11. .end <integer expression>     ;signals the end of the source program.
  551.                                   ;the optional expression, if supplied,
  552.                                   ;specifies the start address of the
  553.                                   ;program, and is included in the
  554.                                   ;Hex object module output
  555.                                   ;of the active segment when the .end
  556.                                   ;was encountered.
  557.  
  558.  
  559. 12. .opdef  <identifier>,<identifier>
  560.                                   ;assigns the current definition of
  561.                                   ;the second <identifier> to the
  562.                                   ;first <identifier>.
  563.                                   ;useful for renaming opcodes and
  564.                                   ;pseudo-ops.
  565.  
  566. 13. .segment <identifier> ',' <integer expression>
  567.                                   ;defines a memory segment name.
  568.                                   ;used to separate memory allocation
  569.                                   ;and optionally generate seperate
  570.                                   ;object files.(see 'o' assembly
  571.                                   ;directive to activate).
  572.                                   ;(used to seperate RAM, ROM, or
  573.                                   ; ROMS)
  574.                                   ;the optional <integer expression> is
  575.                                   ;added to the location counter to
  576.                                   ;offset the load address supplied
  577.                                   ;in the object module. (does not
  578.                                   ;affect listings addresses!)
  579.                                   ;
  580.                                   ;note: .code is the predefined default
  581.                                   ;segment and cannot be redefined.
  582.  
  583. 14. <segment name>                ;selects the segment <segment name>
  584.                                   ;as the current memory segment.
  585.                                   ;The location old segment location counter
  586.                                   ;is saved and the previous value of the
  587.                                   ;newly selected segments location counter
  588.                                   ;is used(0 if not previously used).
  589.  
  590. 15.  .null                        ;directs the assembler to treat this
  591.                                   ;statement as a comment.  Useful to
  592.                                   ;nullify opcodes when used in conjunction
  593.                                   ;with the .opdef pseudo-op.
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601. Appendix   A      ASCII character set
  602.  
  603.  
  604.  
  605. dec oct hex char     dec oct hex char  dec oct hex char  dec oct hex char
  606.  
  607.   0 000  00 ^@ null   32 040  20 sp     64 100  40 @      96 140  60 `
  608.   1 001  01 ^A soh    33 041  21 !      65 101  41 A      97 141  61 a
  609.   2 002  02 ^B stx    34 042  22 "      66 102  42 B      98 142  62 b
  610.   3 003  03 ^C etx    35 043  23 #      67 103  43 C      99 143  63 c
  611.   4 004  04 ^D eot    36 044  24 $      68 104  44 D     100 144  64 d
  612.   5 005  05 ^E enq    37 045  25 %      69 105  45 E     101 145  65 e
  613.   6 006  06 ^F ack    38 046  26 &      70 106  46 F     102 146  66 f
  614.   7 007  07 ^G bel    39 047  27 '      71 107  47 G     103 147  67 g
  615.   8 010  08 ^H bs     40 050  28 (      72 110  48 H     104 150  68 h
  616.   9 011  09 ^I ht     41 051  29 )      73 111  49 I     105 151  69 i
  617.  10 012  0A ^J lf     42 052  2A *      74 112  4A J     106 152  6A j
  618.  11 013  0B ^K vt     43 053  2B +      75 113  4B K     107 153  6B k
  619.  12 014  0C ^L ff     44 054  2C ,      76 114  4C L     108 154  6C l
  620.  13 015  0D ^M cr     45 055  2D -      77 115  4D M     109 155  6D m
  621.  14 016  0E ^N so     46 056  2E .      78 116  4E N     110 156  6E n
  622.  15 017  0F ^O si     47 057  2F /      79 117  4F O     111 157  6F o
  623.  16 020  10 ^P dle    48 060  30 0      80 120  50 P     112 160  70 p
  624.  17 021  11 ^Q dc1    49 061  31 1      81 121  51 Q     113 161  71 q
  625.  18 022  12 ^R dc2    50 062  32 2      82 122  52 R     114 162  72 r
  626.  19 023  13 ^S dc3    51 063  33 3      83 123  53 S     115 163  73 s
  627.  20 024  14 ^T dc4    52 064  34 4      84 124  54 T     116 164  74 t
  628.  21 025  15 ^U nak    53 065  35 5      85 125  55 U     117 165  75 u
  629.  22 026  16 ^V syn    54 066  36 6      86 126  56 V     118 166  76 v
  630.  23 027  17 ^W etb    55 067  37 7      87 127  57 W     119 167  77 w
  631.  24 030  18 ^X can    56 070  38 8      88 130  58 X     120 170  78 x
  632.  25 031  19 ^Y em     57 071  39 9      89 131  59 Y     121 171  79 y
  633.  26 032  1A ^Z sub    58 072  3A :      90 132  5A Z     122 172  7A z
  634.  27 033  1B ^[ esc    59 073  3B ;      91 133  5B [     123 173  7B {
  635.  28 034  1C ^\ fs     60 074  3C <      92 134  5C \     124 174  7C |
  636.  29 035  1D ^] gs     61 075  3D =      93 135  5D ]     125 175  7D }
  637.  30 036  1E ^^ rs     62 076  3E >      94 136  5E ^     126 176  7E ~
  638.  31 037  1F ^_ us     63 077  3F ?      95 137  5F _     127 176  7F del
  639.  
  640.  ^ denotes control key simultaneous with character key.
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648. Appendix B       Copyright Information:
  649.  
  650.  
  651. Disclaimer:
  652.  
  653.             PseudoSam software is distributed as is, with no guarantee that it
  654.             will work correctly in all situations.  In no event will the
  655.             Author be liable for any damages, including lost profits,
  656.             lost savings or other incidental or consequential damages
  657.             arising out of the use of or inability to use these
  658.             programs, even if the Author has been advised of the
  659.             possibility of such damages, or for any claim by any other
  660.             party.
  661.  
  662. Copyright Information:
  663.  
  664.             The entire PseudoSam distribution package, consisting of
  665.             the main program, documentation files, and various data and
  666.             utility files, is copyright (c) 1986, by PseudoCode.
  667.  
  668.             The author reserves the exclusive right to distribute this
  669.             package, or any part thereof, for profit.
  670.  
  671.             The name "PseudoSam (tm)", applied to an assembler
  672.             program, is a trade mark of the PseudoCode company.
  673.  
  674.             PseudoSam version 1.x.xx and various subsidiary files may be
  675.             copied freely by individuals for non-commercial purposes. It
  676.             is expected that those who find the package useful will
  677.             purchase the commercial version.
  678.             ONLY UNMODIFIED VERSIONS DISPLAYING THE AUTHORS COPYRIGHT
  679.             MAY BE COPIED.
  680.  
  681.             User groups and clubs are authorized to distribute PseudoSam
  682.             software under the following conditions:
  683.  
  684.             1.  No charge is made for the software or documentation.  A
  685.                 nominal distribution fee may be charged, provided that
  686.                 it is no more than $10 total.
  687.  
  688.             3.  The program and documentation are not modified in ANY
  689.                 way, and are distributed together.
  690.  
  691.